fn main() {


    // 枚举是一种用户自定义的 数据类型，表示用于有一组离散可能性值的变量
    /*

        枚举的好处
            1. 可以使代码更加严谨，易读
            2. 更符合rust的风格

        常用的枚举类型 Option和Result

        Option包含None和Some
        Result包含Ok和Err

        枚举往往都是配合着matcha匹配模式使用
    
    */


    let my_color = Color::Blue;
    // 所有权已经移交给了函数
    print_color(my_color);
    println!("Hello, 枚举");

    let b1 = BuildingLocation::Name("zhangsan".to_string());
    b1.print_location();
    println!("{:?}", b1);

}

fn print_color(my_color: Color) {
    // 枚举的匹配必须全覆盖,不处理的可以用_包含
    match my_color {
        Color:: Red => println!("Red"),
        Color::Yellow => println!("Yellow"),
        Color::Blue => println!("Blue"),
        _ => (),
    }
}

enum Color {
    Red,
    Yellow,
    Blue,
    Black,
}

#[derive(Debug)]
enum BuildingLocation {
    Number(i32),
    Name(String),   // 如果使用&str需要指定生命周期
    Unknown,  // 标识,不需要存储任何东西
}

// 枚举增加关联函数
impl BuildingLocation {
    // 增加生命周期说明,表示b1被借用，print_location函数执行完, b1依然能够使用
    fn print_location<'a>(&'a self){
        match self {
            BuildingLocation::Number(c) => println!("building number {}",c),
            BuildingLocation::Name(c) => println!("building name {}",c),
            BuildingLocation::Unknown => println!("building Unknown"),
        }
    }
}

